/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package infra;

import br.com.caelum.vraptor.ioc.ApplicationScoped;
import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.ComponentFactory;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

/**
 * Responsável por fornecer dados da configuração do hibernate para gerar
 * comunicação com banco de dados.
 * @author pedro
 */
@Component
@ApplicationScoped
public class CriadorDeSessionFactory implements ComponentFactory<SessionFactory> {

	private SessionFactory factory;

	/**
	 * Deve ser executado antes de getInstance para configurar o hibernate.
	 */
	@PostConstruct
	public void abre(){
		AnnotationConfiguration configuration = new AnnotationConfiguration();
		configuration.configure();

		this.factory = configuration.buildSessionFactory();
	}

	/**
	 * Acessa a atual factory que possui as configurações do hibernate.
	 * @return Configurações do hibernate carregadas.
	 */
	@Override
	public SessionFactory getInstance(){
		return this.factory;
	}

	/**
	 * Deve ser executado quando não se deseja mais usar o que foi
	 * instanciado.
	 */
	@PreDestroy
	public void fecha(){
		this.factory.close();
	}
}
